package main

import "fmt"

func main() {
	//channel 信道，是可以让一个协程与另一个协程传输信息的通道
	//每个信道只能传输一种类型的数据。信道必须用make进行初始化之后，才能使用
	//个人理解：信道很像消息队列

	//信道的定义。int代表信道中的数据类型，10代表信道中的容量
	pipline := make(chan int, 10)

	//信道的数据操作，无非就两种：发送数据与读取数据

	//往信道中发送数据
	pipline <- 200
	pipline <- 88 //可以打开和关闭这里的注释来查看结果

	//从信道中读取一个数据并赋值给mydata
	mydata := <-pipline
	fmt.Println(mydata) //200

	//记忆： <- 箭头是固定这样写的，不会变。关键是它在信道名的左边还是右边。 在右边，就是发送数据。在左边，就是读取数据。

	//信道用完了，可以对其进行关闭，避免有接收方一直在等待。但是你关闭信道后，接收方仍然可以从信道中取到数据
	close(pipline)

	//当从信道中读取数据时，可以有多个返回值，其中第二个可以表示 信道是否还有数据。没数据了，ok 为 false。有数据，ok 为true。
	x, ok := <-pipline
	if ok {
		fmt.Println(x)
	} else {
		fmt.Println("信道没数据了")
	}
}

//在本例中，pipline必须有缓冲，比如10.否则会死锁
//死锁的原因，个人理解是，如果没有缓冲。数据相当于就塞不进信道中。而又没有事先准备好一个接收数据的。就一直尝试塞数据，所以就死锁了。
